package pe.edu.upc.dai.grupovictor.web;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import pe.edu.upc.dai.grupovictor.model.Alumno;
import pe.edu.upc.dai.grupovictor.model.Ciclo;
import pe.edu.upc.dai.grupovictor.model.DetalleSistemaEvaluacion;
import pe.edu.upc.dai.grupovictor.model.Inscripcion;
import pe.edu.upc.dai.grupovictor.model.NotaCurso;
import pe.edu.upc.dai.grupovictor.model.Profesor;
import pe.edu.upc.dai.grupovictor.model.ProgramaCurso;
import pe.edu.upc.dai.grupovictor.model.TipoEvaluacion;
import pe.edu.upc.dai.grupovictor.service.CicloService;
import pe.edu.upc.dai.grupovictor.service.CursoService;
import pe.edu.upc.dai.grupovictor.service.DetalleSistemaEvaluacionService;
import pe.edu.upc.dai.grupovictor.service.InscripcionService;
import pe.edu.upc.dai.grupovictor.service.NotaCursoService;
import pe.edu.upc.dai.grupovictor.service.ProfesorService;
import pe.edu.upc.dai.grupovictor.service.ProgramaCursoService;
import pe.edu.upc.dai.grupovictor.service.SistemaEvaluacionService;
import pe.edu.upc.dai.grupovictor.service.TipoEvaluacionService;
import pe.edu.upc.dai.grupovictor.service.impl.CicloServiceImpl;
import pe.edu.upc.dai.grupovictor.service.impl.CursoServiceImpl;
import pe.edu.upc.dai.grupovictor.service.impl.DetalleSistemaEvaluacionServiceImpl;
import pe.edu.upc.dai.grupovictor.service.impl.InscripcionServiceImpl;
import pe.edu.upc.dai.grupovictor.service.impl.NotaCursoServiceImpl;
import pe.edu.upc.dai.grupovictor.service.impl.ProfesorServiceImpl;
import pe.edu.upc.dai.grupovictor.service.impl.ProgramaCursoServiceImpl;
import pe.edu.upc.dai.grupovictor.service.impl.SistemaEvaluacionServiceImpl;
import pe.edu.upc.dai.grupovictor.service.impl.TipoEvaluacionServiceImpl;
import pe.edu.upc.dai.grupovictor.util.json.JSONArray;
import pe.edu.upc.dai.grupovictor.util.json.JSONException;
import pe.edu.upc.dai.grupovictor.util.json.JSONObject;

public class ProfesorServlet extends HttpServlet {

    private CicloService cicloService;
    private CursoService cursoService;
    private SistemaEvaluacionService sistemaEvaluacionService;
    private DetalleSistemaEvaluacionService detalleSistemaEvaluacionService;
    private TipoEvaluacionService tipoEvaluacionService;
    private ProfesorService profesorService;
    private ProgramaCursoService programaCursoService;
    private InscripcionService inscripcionService;
    private NotaCursoService notaCursoService;

    public ProfesorServlet() {
        cicloService = new CicloServiceImpl();
        cursoService = new CursoServiceImpl();
        sistemaEvaluacionService = new SistemaEvaluacionServiceImpl();
        detalleSistemaEvaluacionService = new DetalleSistemaEvaluacionServiceImpl();
        tipoEvaluacionService = new TipoEvaluacionServiceImpl();
        profesorService = new ProfesorServiceImpl();
        programaCursoService = new ProgramaCursoServiceImpl();
        inscripcionService = new InscripcionServiceImpl();
        inscripcionService = new InscripcionServiceImpl();
        notaCursoService = new NotaCursoServiceImpl();
    }

    protected Profesor getUsuarioProfesor(HttpServletRequest request)
            throws ServletException, IOException {

        HttpSession session = request.getSession(false);
        Profesor profesor = null;

        if (session != null) {
            profesor = (Profesor) session.getAttribute("DAI_PROFESOR");
            if (profesor == null) {
                profesor = profesorService.seleccionarPorCodigo(2003L);
                session.setAttribute("DAI_PROFESOR", profesor);
            }
        } else {
            profesor = profesorService.seleccionarPorCodigo(2003L);
            session.setAttribute("DAI_PROFESOR", profesor);
        }

        return profesor;

    }

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, JSONException {

        String action = request.getParameter("action");

        if ("getCiclos".equalsIgnoreCase(action)) {
            getCiclos(request, response);
        } else if ("getProgramaProfeCiclo".equalsIgnoreCase(action)) {
            getProgramaProfeCiclo(request, response);
        } else if ("getTipoEvalLista".equalsIgnoreCase(action)) {
            getTipoEvalLista(request, response);
        } else if ("getAlumnosProfe".equalsIgnoreCase(action)) {
            getAlumnosProfe(request, response);
        } else if ("saveNotaAlumnos".equalsIgnoreCase(action)) {
            saveNotaAlumnos(request, response);
        }

    }

    protected void saveNotaAlumnos(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, JSONException {

        PrintWriter out = response.getWriter();
        JSONObject jsonObjectRoot = new JSONObject();

        response.setContentType("text/plain");
        response.setCharacterEncoding("UTF-8");

        String notasAlumnos = request.getParameter("alumnos");

        try {

            List<NotaCurso> notas = new ArrayList<NotaCurso>();
            DetalleSistemaEvaluacion detalle = null;
            JSONArray json = new JSONArray(notasAlumnos);

            for (int i = 0; i < json.length(); i++) {
                JSONObject ob = json.getJSONObject(i);
                NotaCurso nota = new NotaCurso();
                ProgramaCurso seccion = new ProgramaCurso();
                Alumno alumno = new Alumno();
                TipoEvaluacion tipoEval = new TipoEvaluacion();

                seccion.setIdSeccion(ob.getLong("seccion.idSeccion"));
                alumno.setIdAlumno(ob.getLong("alumno.idAlumno"));
                tipoEval.setIdTipoEvaluacion(ob.getLong("tipoEvaluacion.idTipoEvaluacion"));
                nota.setNota(Float.valueOf(ob.getString("notaCurso.nota")));

                if (detalle == null) {
                    Long idDetalle = ob.getLong("detalle.idDetalle");
                    detalle = detalleSistemaEvaluacionService.seleccionarPorCodigo(idDetalle);
                }

                nota.setIdSeccion(seccion);
                nota.setIdAlumno(alumno);
                nota.setIdTipoEvaluacion(tipoEval);
                nota.setPeso(detalle.getPesoEvaluacion());

                notas.add(nota);
            }

            notaCursoService.insertar(notas);

            jsonObjectRoot.put("message", "Se agregó satisfactoriamente");
            jsonObjectRoot.put("success", true);
        } catch (Exception e) {
            e.printStackTrace();
            jsonObjectRoot.put("success", false);
            jsonObjectRoot.put("message", e.getLocalizedMessage());
        } finally {
            out.print(jsonObjectRoot.toString());
            out.flush();
            out.close();
        }
    }

    protected void getAlumnosProfe(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        PrintWriter out = response.getWriter();
        JSONObject jsonObjectRoot = new JSONObject();

        response.setContentType("text/plain");
        response.setCharacterEncoding("UTF-8");

        Long idSeccion = Long.valueOf(request.getParameter("idSeccion"));
        Long idEvaluacion = Long.valueOf(request.getParameter("idEvaluacion"));

        try {
            ProgramaCurso seccion = new ProgramaCurso(idSeccion);
            TipoEvaluacion tipoEval = new TipoEvaluacion(idEvaluacion);

            List<Inscripcion> list = inscripcionService.seleccionarTodosBySeccionEval(seccion, tipoEval);
            JSONArray jsonArray = new JSONArray();
            int i = 0;
            for (Inscripcion item : list) {
                JSONObject jsonObject = new JSONObject(item);
                jsonObject.put("profesor", new JSONObject(item.getIdSeccion().getIdProfesor()));
                jsonObject.put("ciclo", new JSONObject(item.getIdSeccion().getIdCiclo()));
                jsonObject.put("curso", new JSONObject(item.getIdSeccion().getIdCurso()));
                jsonObject.put("seccion", new JSONObject(item.getIdSeccion()));
                jsonObject.put("detalle", new JSONObject(item.getDetalleSistemaEvaluacion()));
                jsonObject.put("alumno", new JSONObject(item.getIdAlumno()));
                jsonObject.put("notaCurso", new JSONObject(item.getIdNotaCurso()));
                jsonObject.put("tipoEvaluacion", new JSONObject(item.getIdNotaCurso().getIdTipoEvaluacion()));

                jsonObject.put("rownum", ++i);
                jsonArray.put(jsonObject);
            }
            jsonObjectRoot.put("data", jsonArray);
            jsonObjectRoot.put("totalCount", list.size());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            out.print(jsonObjectRoot.toString());
            out.flush();
            out.close();
        }
    }

    protected void getTipoEvalLista(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, JSONException {
        PrintWriter out = response.getWriter();
        JSONObject jsonObjectRoot = new JSONObject();

        response.setContentType("text/plain");
        response.setCharacterEncoding("UTF-8");

        try {

            List<TipoEvaluacion> list = tipoEvaluacionService.seleccionarTodos();
            JSONArray jsonArray = new JSONArray();
            int i = 0;
            for (TipoEvaluacion item : list) {
                JSONObject jsonObject = new JSONObject(item);
                jsonObject.put("rownum", ++i);
                jsonArray.put(jsonObject);
            }
            jsonObjectRoot.put("data", jsonArray);
            jsonObjectRoot.put("totalCount", list.size());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            out.print(jsonObjectRoot.toString());
            out.flush();
            out.close();
        }
    }

    protected void getProgramaProfeCiclo(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        PrintWriter out = response.getWriter();
        JSONObject jsonObjectRoot = new JSONObject();

        response.setContentType("text/plain");
        response.setCharacterEncoding("UTF-8");

        Profesor profesor = getUsuarioProfesor(request);
        Long idCiclo = Long.valueOf(request.getParameter("idCiclo"));

        try {
            Ciclo ciclo = new Ciclo(idCiclo);
            List<ProgramaCurso> list = programaCursoService.seleccionarTodosByProfeCiclo(profesor, ciclo);
            JSONArray jsonArray = new JSONArray();
            int i = 0;
            for (ProgramaCurso item : list) {
                JSONObject jsonObject = new JSONObject(item);
                jsonObject.put("profesor", new JSONObject(item.getIdProfesor()));
                jsonObject.put("ciclo", new JSONObject(item.getIdCiclo()));
                jsonObject.put("curso", new JSONObject(item.getIdCurso()));

                jsonObject.put("rownum", ++i);
                jsonArray.put(jsonObject);
            }
            jsonObjectRoot.put("data", jsonArray);
            jsonObjectRoot.put("totalCount", list.size());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            out.print(jsonObjectRoot.toString());
            out.flush();
            out.close();
        }
    }

    protected void getCiclos(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        PrintWriter out = response.getWriter();
        JSONObject jsonObjectRoot = new JSONObject();

        response.setContentType("text/plain");
        response.setCharacterEncoding("UTF-8");

        try {

            List<Ciclo> list = cicloService.seleccionarTodos();
            JSONArray jsonArray = new JSONArray();
            int i = 0;
            for (Ciclo item : list) {
                JSONObject jsonObject = new JSONObject(item);
                jsonObject.put("rownum", ++i);
                jsonArray.put(jsonObject);
            }
            jsonObjectRoot.put("data", jsonArray);
            jsonObjectRoot.put("totalCount", list.size());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            out.print(jsonObjectRoot.toString());
            out.flush();
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (JSONException ex) {
            ex.printStackTrace();
        }
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (JSONException ex) {
            Logger.getLogger(ProfesorServlet.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
